package com.cskaoyan.javase.oop1._16import._1another;

// import com.cskaoyan.javase.oop1._16import._0one.Student;

/**
 * import关键字的作用是导包
 * 这里在another包下的Test类中
 * 直接创建Student对象
 *
 * 编译器在查找并决定使用某个class时，它的搜索机制：
 * 1.在同包下时，类名是绝对唯一的，有就有，没有就没有，不存在选择的问题。
 *      这时,不做任何其它额外操作的前提下:
 *      编译器是可以直接通过一个简单类名去查找到一个类的，不需要额外操作，不需要导包。
 *      这可以看成一种"就近原则"，同包已经存在这个类了，自然不需要去外面找。
 *
 * 2.当同包下没有这个类，必须在不同包下寻找时，多个不同包中完全可能存在同名类。
 *      这时要想区分类,使用简单类名是不可能的
 *      所以有两种操作可以解决这个事情:
 *      a.导包,程序员手动导包,指出应该使用哪个包下的哪个类
 *          语法:
 *          import 全限定类名;
 *          (更推荐的方法,常用方法,优先考虑的方法)
 *
 *      b.不用简单类名,而使用全限定类名去使用一个类
 *          这种方式一般都会导致类名过长
 *          不方便
 *          所以不要优先考虑使用它
 *          而应该优先考虑使用导包,import
 *
 *          建议在碰到以下场景时,使用全限定类名:
 *          需要在一个类中,同时使用两个包下的同名类,这时其一一个类就必须用全限定类名了.
 *          (当然真的碰到了这种情况,建议优先考虑改类名)
 *
 *
 * 注意事项:
 * 1.import导包语句应该放在package声明之后，有效代码之前。
 *      正常情况下，我们使用某个类时，IDEA会自动导包，不用太关心这条语句的位置。
 *      一般只需要注意不要用IDEA导错包就可以了。
 *
 * 2.像String、System、Math等常用类很明显不是同包下的类，但我们并没有进行导包操作。
 *      这是因为在Java当中的，"java.lang包"是Java的核心类包，具有隐式的导包。
 *      注意"java.lang包"下的所有类，是隐式的导入了每个Java类，而不是没有导入！
 * 3.实际上完全可以不导包去使用不同包下类，这时要明确指出这个类的所属包，也就是要使用全限定类名。
 * 但是一般情况下，全限定类名都很长，导包仍然是更好的手段。
 * 但是导包总不是都好用，在极少的情况下：
 * 比如，在Demo类中，想要同时访问两个包onepackage、anotherpackage下的两个Student类。
 * 咋办？
 * 很简单，其中一个Student类使用全限定类名，另一个导包或者就近原则直接使用就可以了。
 * （当然条件允许的情况下，干脆把其中一个Student改名会更好。）
 *
 *
 *
 * @since 17:40
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Test {
    public static void main(String[] args) {
        Student s = new Student();
        s.test();
        com.cskaoyan.javase.oop1._16import._0one.Student s2 = new com.cskaoyan.javase.oop1._16import._0one.Student();
        s2.test();
        System.out.println();
    }
}
